local UnitlModule = require("Lua.UnitlModule");

--第十三节 协程

UnitlModule.PrintTimer();

UnitlModule.PrintOperaName("协程的创建");
local coro_1 = coroutine.create(function ()
    print("通过coroutine.create()创建的协程_1");
end);
print(coro_1);

local coro_2 = coroutine.wrap(function ()
    print("通过coroutine.wrap()创建的协程_2");
end);
print(coro_2);
--[[
协程的本质是一个线程对象
coroutine.create()创建返回的是一个thread
coroutine.wrap()创建返回的是一个function
--]]
UnitlModule.PrintOperaName("协程的运行");

--通过线程方式创建的
coroutine.resume(coro_1);
--通过方法方式创建的
coro_2();

--二者不能混合运行，只能用自己的方式运行！！！

UnitlModule.PrintOperaName("协程的挂起");


function CoroutineYieldFunction()
    local i = 0;
    while true do
        print(coroutine.running());--输出当前正在运行的协程的协程号
       i = i + 1;
       --协程的挂起函数
       coroutine.yield(i); -- 这里可以放返回值（无返回值则为nil），
                           --无论放不放返回值，一定返回boolean，为协程是否启动成功
                           --但是只有线程方式的才会返回boolean，方法方式的不会返回
    end
end

local theard_coro = coroutine.create(CoroutineYieldFunction);
local func_coro = coroutine.wrap(CoroutineYieldFunction);

print("线程协程:");
for i=1,3,1 do
   local isOk,val = coroutine.resume(theard_coro);
   print(isOk,val);
end
UnitlModule.NextLine();
print("方法协程:");
for i=1,3,1 do
   local val = func_coro();
   print(val);
end

UnitlModule.PrintOperaName("协程的状态");

print(coroutine.status(theard_coro));

--[[
协程的状态有{dead,suspended,running,normal}
    coroutine.status() 返回string，协程的状态，
    只能传入线程方式的协程，方法方式不行

    coroutine.running()可以得到当前正在运行协程的协程号和是否是主函数
    最好放在正在运行的协程里面执行，否则返回nil
--]]